/**
 * 房间数据模型类
 * 
 * 这个类用来表示酒店中的一个房间，包含房间的所有基本信息
 * 在Java中，这种用来存储数据的类通常叫做"实体类"或"数据模型类"
 * 
 * 主要功能：
 * 1. 存储房间的基本信息（房间号、类型、价格、状态）
 * 2. 提供获取和设置这些信息的方法（getter和setter方法）
 * 3. 提供将房间信息转换为文件格式的方法
 * 4. 提供从文件格式创建房间对象的方法
 */
public class Room {
    // 成员变量（也叫实例变量）- 用来存储房间的各种信息
    // private关键字表示这些变量只能在这个类内部访问，这叫做"封装"

    private String roomNumber; // 房间号，如"101"、"203"等
    private String roomType; // 房间类型，如"标准间"、"豪华间"、"套房"
    private double price; // 房间价格，每晚的费用
    private String status; // 房间状态：空闲、已预定、已入住

    /**
     * 构造方法（构造函数）
     * 
     * 构造方法是创建对象时自动调用的特殊方法
     * 方法名必须与类名相同，没有返回值类型
     * 用来初始化对象的成员变量
     * 
     * @param roomNumber 房间号
     * @param roomType   房间类型
     * @param price      房间价格
     * @param status     房间状态
     */
    public Room(String roomNumber, String roomType, double price, String status) {
        // this关键字表示当前对象，用来区分参数和成员变量
        this.roomNumber = roomNumber;
        this.roomType = roomType;
        this.price = price;
        this.status = status;
    }

    // ==================== Getter方法 ====================
    // Getter方法用来获取私有成员变量的值
    // 这是Java封装特性的体现：通过公共方法访问私有数据

    /**
     * 获取房间号
     * 
     * @return 房间号字符串
     */
    public String getRoomNumber() {
        return roomNumber;
    }

    /**
     * 获取房间类型
     * 
     * @return 房间类型字符串
     */
    public String getRoomType() {
        return roomType;
    }

    /**
     * 获取房间价格
     * 
     * @return 房间价格（double类型）
     */
    public double getPrice() {
        return price;
    }

    /**
     * 获取房间状态
     * 
     * @return 房间状态字符串
     */
    public String getStatus() {
        return status;
    }

    // ==================== Setter方法 ====================
    // Setter方法用来设置私有成员变量的值
    // 可以在设置前进行数据验证，保证数据的正确性

    /**
     * 设置房间号
     * 
     * @param roomNumber 新的房间号
     */
    public void setRoomNumber(String roomNumber) {
        this.roomNumber = roomNumber;
    }

    /**
     * 设置房间类型
     * 
     * @param roomType 新的房间类型
     */
    public void setRoomType(String roomType) {
        this.roomType = roomType;
    }

    /**
     * 设置房间价格
     * 
     * @param price 新的房间价格
     */
    public void setPrice(double price) {
        this.price = price;
    }

    /**
     * 设置房间状态
     * 
     * @param status 新的房间状态
     */
    public void setStatus(String status) {
        this.status = status;
    }

    /**
     * 将房间信息转换为文件存储格式
     * 
     * 这个方法将房间的所有信息用"|"符号连接成一个字符串
     * 这样就可以把房间信息保存到文本文件中
     * 
     * 格式：房间号|房间类型|价格|状态
     * 例如：101|标准间|200.0|空闲
     * 
     * @return 格式化的字符串，用于文件存储
     */
    public String toFileString() {
        // 使用"+"号连接字符串，"|"作为分隔符
        return roomNumber + "|" + roomType + "|" + price + "|" + status;
    }

    /**
     * 从文件格式的字符串创建Room对象
     * 
     * 这是一个静态方法，可以直接通过类名调用：Room.fromFileString(...)
     * 静态方法不需要创建对象就能使用
     * 
     * 这个方法的作用是把从文件中读取的字符串转换回Room对象
     * 
     * @param line 从文件中读取的一行数据
     * @return 创建的Room对象，如果数据格式错误则返回null
     */
    public static Room fromFileString(String line) {
        // split()方法用来分割字符串
        // "\\|"是正则表达式，表示以"|"符号分割
        // 因为"|"在正则表达式中有特殊含义，所以要用"\\"转义
        String[] parts = line.split("\\|");

        // 检查分割后的数组长度是否为4（房间号、类型、价格、状态）
        if (parts.length == 4) {
            // Double.parseDouble()方法将字符串转换为double类型
            // 如果字符串不是有效的数字，会抛出异常
            return new Room(parts[0], parts[1], Double.parseDouble(parts[2]), parts[3]);
        }

        // 如果数据格式不正确，返回null
        return null;
    }

    /**
     * 重写toString()方法
     * 
     * toString()是Object类的方法，所有Java类都继承自Object类
     * 
     * @Override注解表示我们要重写父类的方法
     * 
     *                         这个方法定义了当我们打印Room对象时显示的内容
     *                         例如：System.out.println(room); 会调用这个方法
     * 
     * @return 房间信息的友好显示格式
     */
    @Override
    public String toString() {
        // 返回一个用户友好的字符串格式
        return "房间号: " + roomNumber + ", 类型: " + roomType +
                ", 价格: ¥" + price + ", 状态: " + status;
    }
}